public class MaxConsecutiveOnesIII {
    // 规则: 窗口内0的个数只能有k个
    // 更新结果: 窗口内 0 的个数小于等于 k, 即窗口内元素合法就更新结果
    public int longestOnes(int[] nums, int k) {
        int n = nums.length;
        int zero = 0; // 记录窗口内 0 的个数
        int left = 0, right = 0;
        int len = 0; // 窗口size
        while(right < n) {
            // 1.进窗口(只要 0 个数合法, right 一直向后扩大窗口, 反过来, 遇到零 zero++)
            if(nums[right] == 0) {
                zero++;
            }

            while(zero > k) {
                // 如果窗口内 0 的个数大于 k, 则窗口不合法, 出窗口, 直到 0 合法
                if(nums[left] == 0) {
                    zero--;
                }
                left++;
            }

            // 窗口合法更新结果
            if(right - left + 1 > len) {
                len = right - left + 1;
            }
            right++;
        }
        return len;
    }
}
